package com.example.usbhidtool.hid;

import android.util.Log;

import java.io.UnsupportedEncodingException;

/**
 * 数据打包工具类
 */
public class DataPack {

    /**
     * 基础打包格式
     * 发送时候，每个包都是512个字节【 4个控制字节，508个数据字节】
     * 第一个字节：type
     * 第二个字节：type
     * 第三、四个字节：有效数据的长度（508个字节中可能只有部分有效）
     *
     * @param type
     * @param data
     * @return
     */
    private static byte[] basePack(byte type, byte[] data/*UTF-8*/) {
        short len = data.length > 508 ? 508 : (short) data.length;
        byte[] bytes = new byte[512];
        bytes[0] = type;
        bytes[1] = type;
        bytes[2] = (byte) (len);
        bytes[3] = (byte) ((len >> 8) & 0xff);
        System.arraycopy(data, 0, bytes, 4, len);
        return bytes;
    }

    /**
     * 基础包type:0xC1:表示该包发送的是一个指令
     *
     * @param str
     * @return
     */
    public static byte[] cmdPack(String str) {
        byte[] buf = new byte[1];
        try {
            buf = str.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return basePack((byte) 0xC1, buf);
    }

    /**
     * 基础包type:0xC2:表示该包是即将到来的数据或者文件的头信息
     *
     * @param isFile 是否文件
     * @param leng   数据，文件的长度
     * @param bytes  可以传一些校验信息
     *               控制字段：占据508字节的前5个字节：
     *               第一个字节：是否文件，ox01表示文件
     *               第二个字节---第5个字节：表示数据或者文件的长度
     */
    public static byte[] infoPack(boolean isFile, int leng, byte[] bytes) {
        byte[] bytes1 = new byte[508];
        bytes1[0] = (byte) (isFile ? 0x01 : 0x00);//不是文件
        for (int i = 0; i < 4; i++) {
            bytes1[i + 1] = (byte) ((leng >> 8 * i) & 0xff);
            Log.d("infopack", "infopack: " + Integer.toHexString(bytes1[i + 1]));
        }
        if (isFile) System.arraycopy(bytes, 0, bytes1, 5, bytes.length);
        return basePack((byte) 0xC2, bytes1);
    }

    /**
     * 基础包type:0xF1:表示该包是数据信息或者文件信息
     *
     * @param bytes
     * @return
     */
    public static byte[] dataPack(byte[] bytes) {
        return basePack((byte) 0xF1, bytes);
    }

}
